package com.example.AIstudy.security;

import io.jsonwebtoken.Claims;
import org.apache.logging.log4j.util.Strings;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.http.HttpHeaders;
import org.springframework.stereotype.Component;
import org.springframework.web.filter.OncePerRequestFilter;

import javax.servlet.FilterChain;
import javax.servlet.ServletException;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;
import java.io.IOException;

//暂时先不做token

//@Component
//public class JwtRequestFilter extends OncePerRequestFilter {
//    @Autowired
//    private UserDetailsService userDetailsService;
//    @Autowired
//    private JwtTokenUtil jwtTokenUtil;
//
//    @Override
//    protected void doFilterInternal(HttpServletRequest request, HttpServletResponse response, FilterChain chain)
//            throws ServletException, IOException {
//        final String header = request.getHeader(HttpHeaders.AUTHORIZATION);
//
//        //如果请求头为空，或者请求头没有带token信息
//        if (Strings.isEmpty(header) || !header.startsWith("Bearer ")) {
//            chain.doFilter(request, response); //调用后续的过滤器
//            return;
//        }
//        try {
//            final String token = header.substring(7);
//
//            //解析token，如果token不合法会抛出异常
//            Claims claims = jwtTokenUtil.getClaimFromToken(token);
//
//            //根据openID获取用户的信息（把subject设置成openID）
//            UserDetails userDetails = userDetailsService.loadUserByUsername(claims.getSubject());
//
//            // userDetails不为空，说明验证通过，用户名密码等信息正确
//            if (userDetails != null && jwtTokenUtil.validateClaim(claims, userDetails)) {
//
//                //创建一个身份令牌放入security context中，后面的过滤器可以使用
//                UsernamePasswordAuthenticationToken authenticationToken =
//                        new UsernamePasswordAuthenticationToken(userDetails, null, userDetails.getAuthorities());
//                authenticationToken.setDetails(new WebAuthenticationDetailsSource().buildDetails(request));
//
//                //验证结束后，已经将权限加到用户信息安全上下文中，可以用来判断用户是否具备某项权限（在controller函数上添加注解）
//                SecurityContextHolder.getContext().setAuthentication(authenticationToken);
//            }
//        } catch (Exception e) {
//            //解析token时产生的异常记入日志，不用直接抛出。因为后续的过滤器没有身份信息，会返回认证错误
//            logger.warn(e);
//        }
//        chain.doFilter(request, response); //调用后续的过滤器
//    }
//}

